import os
import sys
import json


class userDataLoader:
    a_week = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]

    def __init__(self, ini_dict):
        # 参数传递
        self.version = ini_dict["程序版本"]
        self.exe_cmd = str(ini_dict["开服命令"])
        self.exe_ReAlive = ini_dict["崩溃重启"]
        self.exe_Bak = ini_dict["自动备份"]
        self.re_bak_day = [self.a_week[i - 1] for i in ini_dict["周备份日"]]
        self.re_bak_time = [str(t).replace(":", "").replace("：", "") + "00" for t in ini_dict["备份时间"]]
        self.world_dir = str(ini_dict["存档路径"])
        self.bak_dir = str(ini_dict["保存位置"])
        self.bak_name = str(ini_dict["保存文件名"])
        self.robot_on = ini_dict["启用机器人"]
        self.robot_host = ini_dict["机器人地址"]
        self.robot_port = ini_dict["机器人端口"]
        self.robot_key = str(ini_dict["verifyKey"])
        self.robot_qq = ini_dict["机器人QQ号"]
        self.robot_owner = ini_dict["管理员QQ号"]
        self.robot_group = ini_dict["管理QQ群号"]
        self.robot_reList = ini_dict["正则匹配"]
        self.robot_group_cmd = ini_dict["群自定义命令"]
        # 参数检查
        self.__check()

    # 加__表示私有成员
    def __check(self):
        # 读取版本
        if self.version != 1.2:
            input("[DLS] 配置文件版本过低，请使用新版再运行本程序")
            sys.exit()
        # 备份路径异常处理
        if self.exe_Bak and not os.path.exists(self.world_dir):
            print("[DLS] 备份路径不存在！")
            self.exe_Bak = False
            print("[DLS] 自动备份将被禁用")
        # 备份保存路径异常处理
        if self.exe_Bak and not os.path.exists(self.bak_dir):
            try:
                os.mkdir(self.bak_dir)
            except Exception as err:
                print(f"[DLS] 备份保存路径有误！错误: {err}")
                self.exe_Bak = False
                print("[DLS] 自动备份将被禁用")
        if type(self.robot_reList) != list:
            print("[DLS] 正则匹配格式异常！")
            self.robot_reList = []
            print("[DLS] 正则匹配功能被禁用")
        if type(self.robot_group_cmd) != list:
            print("[DLS] 群消息匹配格式异常！")
            self.robot_group_cmd = []
            print("[DLS] 群消息匹配功能被禁用")


class userData:
    __data_path = os.getcwd() + "/"
    __ini_dir = __data_path + "DLS/"
    __ini_files = ["配置.json", "备份.json", "机器人配置.json", "机器人正则.json", "机器人命令.json"]
    __data_dir = __data_path + "DLS/数据/"
    __data_files = ["命令次数记录.json"]

    def __init__(self):
        self.iniCls = self.loadIni()
        if not os.path.isdir(self.__data_dir):
            os.mkdir(self.__data_dir)
        self.dataDict = self.loadDataDict()
        print("[DLS] 配置文件均已加载完毕！")

    # 重加载所有配置
    def reload(self):
        self.__init__()

    # 加载配置生成对象
    def loadIni(self):
        try:
            return userDataLoader(self.createDict())
        except Exception as err:
            input(f"[DLS] 配置文件格式有误，程序退出 {err}")
            sys.exit()

    # 加载文件并合并字典
    def createDict(self):
        ini_dict = {}
        for file in self.__ini_files:
            content = self.loadJson(self.__ini_dir + file)
            if type(content) == dict:
                ini_dict.update(content)
            else:
                print(f"[DLS][ERROR] 加载配置文件{self.__ini_dir + file}失败！")
        return ini_dict

    # 加载数据文件并合并字典
    def loadDataDict(self):
        data_dict = {}
        for file in self.__data_files:
            content = self.loadJson(self.__data_dir + file)
            if type(content) == dict:
                data_dict.update(content)
            # 文件不存在则不加载
            elif content == "1":
                continue
            else:
                print(f"[DLS][ERROR] 加载数据文件{self.__ini_dir + file}失败！")
        return data_dict

    # 从文件加载json
    @staticmethod
    def loadJson(file_name):
        if os.path.exists(file_name):
            try:
                with open(file_name, "r", encoding="utf-8") as f:
                    return json.loads(f.read())
            except Exception as err:
                print("[DLS][ERROR]" + str(err))
                return
        else:
            return "1"
